<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>栈</title>
</head>
<body>
<h2>栈数据结构</h2>
<p>栈是一种遵从后进先出（LIFO）原则的有序集合。</p>
<p>新添加的或待删除的元素都保存在栈的同一端，称作栈顶，另一端就叫栈底。</p>
<p>在栈里，新元素都靠近栈顶，旧元素都接近栈底。</p>
<p>在现实生活中也能发现很多栈的例子，一摞书或者餐厅里堆放的盘子。</p>
<p>我们将创建一个类来表示栈。让我们从基础开始，先声明这个类：</p>
<p>function Stack() { //各种属性和方法的声明 }</p>
<p>首先，我们需要一种数据结构来保存栈里的元素。可以选择数组：</p>
<p>let items = [];</p>
<p>接下来，要为我们的栈声明一些方法。</p>
<p> push(element(s))：添加一个（或几个）新元素到栈顶。</p>
<p> pop()：移除栈顶的元素，同时返回被移除的元素。</p>
<p> peek()：返回栈顶的元素，不对栈做任何修改（这个方法不会移除栈顶的元素，仅仅返 回它）。</p>
<p> isEmpty()：如果栈里没有任何元素就返回true，否则返回false。</p>
<p> clear()：移除栈里的所有元素。</p>
<p> size()：返回栈里的元素个数。这个方法和数组的length属性很类似。</p>
<script type="text/javascript">
    /***********************************************************************************************************/
    // 创建栈
    function Stack() {
        let items = [];
        /**
         * push(element)
         * @param element：添加的新元素
         * 这个方法负责往栈里添加新元素，有一点很重要：该方法只添加元素到栈顶，也就是栈的末尾。
         * **/
        this.push = function (element) {
            items.push(element)
        };
        /**
         * pop()
         * 这个方法主要用来移除栈里的元素。栈遵从LIFO原则，因此移出的是最后添加进去的元素。
         * **/
        this.pop = function () {
            return items.pop();
        };
        /**
         * peek()
         * 查找最后添加的元素是什么，返回栈顶的元素。
         * **/
        this.peek = function () {
            return items[items.length - 1];
        };
        /**
         * isEmpty()
         * 检查栈是否为空，如果栈为空的话将返回true，否则就返回false：
         * **/
        this.isEmpty = function () {
            return items.length == 0;
        };
        /**
         * size()
         * 返回栈里的元素个数
         * **/
        this.size = function () {
            return items.length;
        };
        /**
         * clear()
         * 移除栈里所有的元素
         * **/
        this.clear = function () {
            items = [];
        };
        /**
         * print()
         * 把栈里的元素都输出到控制台
         * **/
        this.print = function () {
            console.log(items.toString());
        };
    }
    /***********************************************************************************************************/
    // 使用栈Stack类
    let stack = new Stack();
    console.log(stack.isEmpty()); //输出为true
    stack.push(5);
    stack.push(8);
    console.log(stack.peek()); //输出8
    stack.push(11);
    console.log(stack.size()); //输出3
    console.log(stack.isEmpty()); //输出false
    stack.push(15);
    stack.pop();
    stack.pop();
    console.log(stack.size()); //输出2
    stack.print(); //输出[5, 8]
    /***********************************************************************************************************/
</script>
</body>
</html>
